/**
 *
 */
package com.honeybees.framework.mybatis.sqlsource;

import java.util.List;

import org.apache.ibatis.builder.StaticSqlSource;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.apache.ibatis.session.Configuration;

/**
 * <dl>
 * <dt><b> 支持分页的静态SqlSource </b></dt>
 * <p>
 * <dd>功能描述</dd>
 * </dl>
 * <p>
 * Copyright (C) All rights reserved.
 * </p>
 *
 * @author 李远明
 * @since 2016年7月20日 下午8:44:34
 */
public class PageStaticSqlSource extends AbstractPageSqlSource {

    private String sql;
    private List<ParameterMapping> parameterMappings;
    private SqlSource rawSqlSource;

    @SuppressWarnings("unchecked")
    public PageStaticSqlSource(StaticSqlSource sqlSource) {
        MetaObject metaObject = SystemMetaObject.forObject(sqlSource);
        this.sql = (String) metaObject.getValue("sql");
        this.parameterMappings = (List<ParameterMapping>) metaObject.getValue("parameterMappings");
        this.configuration = (Configuration) metaObject.getValue("configuration");
        this.rawSqlSource = sqlSource;
    }

    /**
     * {@inheritDoc}
     *
     * @author 李远明
     * @version 2016年7月25日 上午10:15:37
     */
    @Override
    protected BoundSql getDefaultBoundSql(Object parameterObject) {
        String tempSql = sql;
        return new BoundSql(configuration, tempSql, parameterMappings, parameterObject);
    }

    /**
     * {@inheritDoc}
     *
     * @author 李远明
     * @version 2016年7月20日 下午8:44:34
     */
    @Override
    protected BoundSql getCountBoundSql(Object parameterObject) {
        return new BoundSql(configuration, dialect.getCountSql(sql), parameterMappings, parameterObject);
    }

    /**
     * {@inheritDoc}
     *
     * @author 李远明
     * @version 2016年7月20日 下午8:44:34
     */
    @Override
    protected BoundSql getPageBoundSql(Object parameterObject) {
        String pageSql = dialect.getPageSql(sql, offset, limit);
        BoundSql boundSql = rawSqlSource.getBoundSql(parameterObject);
        return new BoundSql(configuration, pageSql,
                getPageParameterMapping(configuration, boundSql), parameterObject);
    }

}
